import gzip
import json
import re

from service.db_service import DatabaseConfig


def db_init():
    from service.db_service import SqlLiteService
    db_config = DatabaseConfig()
    db = SqlLiteService(db_config)
    columns = [
        ("id", "INTEGER PRIMARY KEY"),  # 主键字段
        ("name", "TEXT"),  # 字符串字段
        ("workstation_id", "TEXT"),
        ("initial_url", "TEXT"),
        ("callback_url", "TEXT"),
        ("cache_dir", "TEXT"),
        ("is_open", "INTEGER")  # 使用非保留字替代 "open"
    ]

    # self.table_schemas = {
    #     "workstations": TableSchema(
    #         name="workstations",
    #         columns={
    #             "workstation_id": "TEXT UNIQUE NOT NULL",
    #             # ...其他字段
    #         },
    #         indexes=["idx_workstation_id"]
    #     )
    # }
    # ret = db.create_table(table_name="workstations", columns=columns)


import gzip
import re


def extract_json(data, logger=None):
    """
    解压并提取拼多多websocket收到的消息数据
    :param data: 收到的原始二进制数据
    :return: 提取成功返回json字符串数据，失败返回None
    """
    # 定义截取的头部和尾部
    header = b'\x1f\x8b\x08\x00'
    footer = b'\x00\x00'

    if data.find(footer, data.find(header) + len(header)) == -1:
        # 动态匹配结束标志：\x00\x00后跟 [任意1字节] + \x01 + [任意1字节]
        end_pattern = re.compile(b'\x00\x00[0,p,h]')
        end_match = end_pattern.search(data, data.find(header) + len(header))
        if logger:
            logger.debug(f"原始数据: {data}")
        if not end_match:
            raise ValueError("未找到动态结束标志")
        footer = end_match.group(0)

    fake_tail = b'\x00\x00\x00\x00\x00\x00\x00\x00'  # 全零伪尾部

    try:
        header_index = data.find(header)
        footer_index = data.find(footer, header_index + len(header) + 20)

        # 修复判断条件并验证顺序
        if header_index == -1 or footer_index == -1:
            return None
        if header_index >= footer_index:
            return None

        # 截取有效数据段
        data_segment = data[header_index:footer_index]
        data_segment += fake_tail

        if logger:
            logger.debug(f"有效数据段: {data_segment}")

        # 解压处理并捕获常见压缩异常
        decompressed = gzip.decompress(data_segment)
        decompressed_utf8 = decompressed.decode('utf-8', errors='ignore')

        # 优化正则匹配逻辑
        json_match = re.search(r'\{.*\}', decompressed_utf8, re.DOTALL)

        # 验证json的完整性
        if json_match and json_match.group(0):
            try:
                json_data = json.loads(json_match.group(0))
            except json.JSONDecodeError:
                raise ValueError("提取的json数据不完整，提取的数据：" + json_match.group(0))

        return json_match.group(0) if json_match else None

    except (EOFError, OSError, ValueError, IndexError) as e:
        # 捕获并处理以下异常：
        # - gzip解压异常（EOFError/OSError）
        # - 正则匹配异常（ValueError/IndexError）
        print(f"解压失败：{e}")
        return None

